import java.util.Arrays;

public class RemoveElement {
    //给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
    //
    //假设 nums 中不等于 val 的元素数量为 k，要通过此题，您需要执行以下操作：
    //更改 nums 数组，使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
    //返回 k。

    public static void main(String[] args) {
       //用双指针法，一头一尾，头部指针寻找等于val的元素，尾部指针寻找不等于val的元素，当头尾指针相遇时循环结束
        // 用一个计数器k记录数组中值等于val的元素个数，最后返回数组长度-k
        int[] nums = new int[]{0,1,2,2,3,0,4,2};
        int val  = 2;

        int result  = removeElement(nums,val);
        System.out.println(result);
        System.out.println(Arrays.toString(nums));

    }

    public static int  removeElement(int[] array,int val) {
        int k = 0;
        int length = array.length;

        for (int i = 0; i < array.length; i++) {
            if(array[i] == val) {
                k++;
            }
        }

        int i = 0;
        int j = array.length - 1;
        int tmp = 0;

        while(i < j) {
            while(i < j && array[i] != val) {
                i++;
            }

            while(i < j && array[j] == val) {
                j--;
            }

            tmp = array[i];
            array[i] = array[j];
            array[j] = tmp;

            i++;
            j--;
        }
        return length - k;
    }
}
